import pandas as pd
from scipy.stats import shapiro


def check_normality(file_path, sheet_name, column_index):
    """
    检验Excel文件中某一列数据是否符合正态分布（Shapiro-Wilk检验）
    参数：
    - file_path: Excel文件路径
    - sheet_name: 工作表名称
    - column_index: 列索引（从0开始）
    """
    try:
        # 读取Excel数据
        df = pd.read_excel(file_path, sheet_name=sheet_name)

        # 提取目标列（根据索引）
        data = df.iloc[0:9, column_index].dropna().values
        print(data)
        # 执行Shapiro-Wilk检验
        stat, p_value = shapiro(data)

        # 结果解释（显著性水平α=0.05）
        alpha = 0.05
        result = {
            "statistic": stat,
            "p_value": p_value,
            "normal_distribution": p_value > alpha,
            "conclusion": "数据服从正态分布" if p_value > alpha
            else "数据不服从正态分布"
        }
        return result

    except FileNotFoundError:
        print(f"错误：文件 {file_path} 不存在")
    except IndexError:
        print(f"错误：列索引 {column_index} 超出范围（工作表共有 {df.shape[1]} 列）")
    except Exception as e:
        print(f"未知错误：{e}")


# 示例用法
if __name__ == "__main__":
    file_path = "数据/数据.xlsx"  # 替换为你的Excel路径
    sheet_name = "Sheet1"  # 工作表名称
    column_index = 0  # 检验第1列（索引从0开始）

    result = check_normality(file_path, sheet_name, column_index)


    if result:
        print("\n检验结果：")
        print(f"统计量(W): {result['statistic']:.4f}")
        print(f"P值: {result['p_value']:.4f}")
        print(f"结论: {result['conclusion']}\n")
        print("解读：")
        print("若P值 > 0.05，不能拒绝原假设，认为数据服从正态分布")
        print("若P值 ≤ 0.05，拒绝原假设，认为数据不服从正态分布")